package com.dongnao.barry.ls38_rxjavaopertor.rxjava;

import android.util.Log;

/**
 * Created by Administrator on 2018/5/30.
 */
//  角色  ：外包公司
//  作用： 起提供农民工角色  在apply 方法中 返回农名工
public class OperatorMap<T,R>  implements  Operator<R,T>{
//
    /** Map中T转为R类型的工具 */
    Function<? super T, ? extends R> function;
    public OperatorMap(Function<? super T, ? extends R> function) {
        this.function = function;
    }


    /**
     * 顾客的  Observer<? super R> observer
     * @param observer
     * @return 返回农名工
     */
    @Override
    public Observer<? super T> apply(Observer<? super R> observer) {
        return new MapSubscrible<>(observer,function);
    }

    /**
     *      *  角色   农民工（观察者）   Rxjava中为了链式调度 内部设计出的观察者
                作用： 真正将排版的内容  转换成 报纸  并且最终通知顾客   （顾客也是观察者）
                rxjava  里面  内部观察者
     */
    private class MapSubscrible<T, R> extends Observer<T> {
        private final String TAG = MapSubscrible.class.getName();
        /** 顾客*/
        private Observer<? super R> actual;
//        顾客  角色：变换函数   rxjava中 不提供 将需求变成你想要的结果，只是提供模板
//       作用：  调用从MainActivity实现的转换函数， 返回结果 给顾客
//      来源 ：   由MainActivity传过来 。

        private Function<? super T,? extends  R> transform;

        public MapSubscrible(Observer<? super R> actual, Function<? super T, ? extends R> transform) {
            this.actual = actual;
            this.transform = transform;
        }

        @Override
        public void onNext(T t) {
            Log.e(TAG, "onNext:--------> 2 ");
//              是真正做转换的地方  根据外部的function(即Map方法中创建的Function)     将string 转换成 bitmap
                R r= transform.apply(t);
//                通知下一个观察者 即调用顾客的OnNext方法
                actual.onNext(r);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    }


}
